home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib13.dsk
/
NIBBLE ILLUSTRATOR.bas
< prev
next >
Wrap
BASIC Source File
|
2023-02-26
|
26KB
|
621 lines
10 REM **********************
11 REM * NIBBLE ILLUSTRATOR *
12 REM * BY COLIN FRENCH *
13 REM * COPYRIGHT (C) 1983 *
14 REM * BY MICROSPARC, INC *
15 REM * LINCOLN, MA. 01773 *
16 REM **********************
180 IF PEEK(104) = 64 THEN 230
190 POKE 103,1: POKE 104,64: POKE 16384,0
200 PRINT CHR$(4);"RUN NIBBLE ILLUSTRATOR"
210 REM ***** INITIALIZATION *******************
220 :
230 D$ = CHR$(4): TEXT : HOME
270 L1 = 0:H1 = 3:L2 = 253:H2 = 9
280 PRINT D$;"BLOAD ITABLE,A$300"
290 DIM L(255)
390 TEXT : HOME : VTAB 22: PRINT "** COPYRIGHT 1983 BY MICROSPARC, INC. **": GOTO 430
400 :
410 REM ******* MAIN MENU **********************
420 TEXT : HOME
430 VTAB 3
440 PRINT TAB( 7);"**************************"
450 PRINT TAB( 7);"* *"
460 PRINT TAB( 7);"* NIBBLE ILLUSTRATOR *"
470 PRINT TAB( 7);"* *": REM 24 SPACES IN QUOTES
480 PRINT TAB( 7);"**************************"
490 VTAB 10
500 PRINT TAB( 9);"E - EDIT VECTOR FILES": PRINT
510 PRINT TAB( 9);"B - BUILD SHAPE TABLE": PRINT
520 PRINT TAB( 9);"V - VIEW SHAPE TABLE": PRINT
530 PRINT TAB( 9);"? - FOR INSTRUCTIONS": PRINT
540 PRINT TAB( 9);"<ESC> TO QUIT PROGRAM"
550 VTAB 24
560 PRINT TAB( 9);"WHICH WOULD YOU LIKE? ";
570 GET Z$
580 IF Z$ = "E" THEN 2000
590 IF Z$ = "B" THEN 6000
600 IF Z$ = "V" THEN 7000
610 IF Z$ = "?" THEN LOC = 1: GOTO 8000
620 IF Z$ = CHR$(27) THEN HOME : POKE 103,1: POKE 104,8: POKE 105,24: POKE 106,8: END
630 GOTO 570
700 :
710 REM ****** MULTI-LETTER INPUT **************
720 :
730 W$ = ""
740 GET Z$
750 IF Z$ = CHR$(13) THEN RETURN
760 IF Z$ = CHR$(8) THEN 800
770 IF LEN(W$) = LMT THEN 740
780 IF Z$ = "," THEN 740
790 PRINT Z$;:W$ = W$ +Z$: GOTO 740
800 IF LEN(W$) = 0 THEN 740
810 PRINT CHR$(8);: PRINT " ";: PRINT CHR$(8);
820 IF LEN(W$) = 1 THEN 730
830 W$ = LEFT$(W$, LEN(W$) -1): GOTO 740
1000 :
1010 REM ****** DRAW/ERASE CURSOR ***************
1020 :
1030 POKE 232,L1: POKE 233,H1: ROT= 0: SCALE= 1
1040 XDRAW 1 AT XC,YC
1050 RETURN
1100 :
1110 REM ****** DRAW/ERASE SMALL SHAPES *********
1120 :
1130 IF PEEK(2561) = 0 THEN 1170
1140 POKE 232,L2: POKE 233,H2: ROT= 0: SCALE= 1
1150 DRAW 1 AT 233 + INT(XS/5),40 + INT(YS/5)
1160 ROT= 16: DRAW 1 AT 266 - INT(YS/5),90 + INT(XS/5)
1170 RETURN
1200 :
1210 REM ****** DRAW/ERASE BLOCK ****************
1220 :
1230 POKE 232,L1: POKE 233,H1: ROT= 0: SCALE= 1
1240 DRAW 2 AT OX,OY
1250 RETURN
1300 :
1310 REM ****** POSTION CURSOR ******************
1320 :
1330 VTAB 22: PRINT " ": REM 39 SPACES IN QUOTES
1340 PRINT "POSITION CURSOR WHERE PLOTTING SHOULD "
1350 PRINT "BEGIN, THEN PRESS THE SPACE BAR ";
1360 GET Z$: GOSUB 1000
1370 IF Z$ = "I" THEN YC = YC -5: IF YC <0 THEN YC = 2
1380 IF Z$ = "J" THEN XC = XC -5: IF XC <0 THEN XC = 2
1390 IF Z$ = "K" THEN XC = XC +5: IF XC >219 THEN XC = 217
1400 IF Z$ = "M" THEN YC = YC +5: IF YC >159 THEN YC = 157
1410 IF Z$ = " " THEN RETURN
1420 IF Z$ = "?" THEN LOC = 2: GOTO 8000
1430 GOSUB 1000: GOTO 1360
1500 :
1510 REM **** CONVERT BYTE TO BINARY STRING *****
1520 :
1530 B$ = "": IF INT(BT/128) THEN BT = BT -128:B$ = B$ +"1": GOTO 1550
1540 B$ = B$ +"0"
1550 IF INT(BT/64) THEN BT = BT -64:B$ = B$ +"1": GOTO 1570
1560 B$ = B$ +"0"
1570 IF INT(BT/32) THEN BT = BT -32:B$ = B$ +"1": GOTO 1590
1580 B$ = B$ +"0"
1590 IF INT(BT/16) THEN BT = BT -16:B$ = B$ +"1": GOTO 1610
1600 B$ = B$ +"0"
1610 IF INT(BT/8) THEN BT = BT -8:B$ = B$ +"1": GOTO 1630
1620 B$ = B$ +"0"
1630 IF INT(BT/4) THEN BT = BT -4:B$ = B$ +"1": GOTO 1650
1640 B$ = B$ +"0"
1650 IF INT(BT/2) THEN BT = BT -2:B$ = B$ +"1": GOTO 1670
1660 B$ = B$ +"0"
1670 IF BT THEN B$ = B$ +"1": GOTO 1690
1680 B$ = B$ +"0"
1690 RETURN
1700 :
1710 REM ****** DRAW LARGE SHAPE ****************
1720 :
1730 AA = AD: ROT= 0: SCALE= 1:XC = XS:YC = YS:FER = 0
1740 BT = PEEK(AA): IF BT = 0 THEN 1910
1750 REM -CONVERT TO BINARY STRING-
1760 GOSUB 1500
1770 OX = XC:OY = YC
1780 IF MID$ (B$,6,1) = "1" THEN HCOLOR= 0: GOSUB 1200: POKE 232,L1: POKE 233,H1: HCOLOR= 3: DRAW SH AT XC,YC
1790 IF MID$ (B$,7,2) = "00" THEN YC = YC -5: IF YC <0 THEN FER = 1:YC = 2: GOTO 1940
1800 IF MID$ (B$,7,2) = "11" THEN XC = XC -5: IF XC <0 THEN FER = 1:XC = 2: GOTO 1940
1810 IF MID$ (B$,7,2) = "01" THEN XC = XC +5: IF XC >219 THEN FER = 1:XC = 217: GOTO 1940
1820 IF MID$ (B$,7,2) = "10" THEN YC = YC +5: IF YC >159 THEN FER = 1:YC = 157: GOTO 1940
1830 OX = XC:OY = YC
1840 IF MID$ (B$,3,3) = "000" THEN 1900
1850 IF MID$ (B$,3,1) = "1" THEN HCOLOR= 0: GOSUB 1200: POKE 232,L1: POKE 233,H1: HCOLOR= 3: DRAW SH AT XC,YC
1860 IF MID$ (B$,4,2) = "00" THEN YC = YC -5: IF YC <0 THEN FER = 1:YC = 2: GOTO 1940
1870 IF MID$ (B$,4,2) = "11" THEN XC = XC -5: IF XC <0 THEN FER = 1:XC = 2: GOTO 1940
1880 IF MID$ (B$,4,2) = "01" THEN XC = XC +5: IF XC >219 THEN FER = 1:XC = 217: GOTO 1940
1890 IF MID$ (B$,4,2) = "10" THEN YC = YC +5: IF YC >159 THEN FER = 1:YC = 157: GOTO 1940
1900 AA = AA +1: GOTO 1740
1910 IF AA = AD THEN 1940
1920 IF MID$ (B$,3,3) = "000" THEN AA = AA -1:V = 2: GOTO 1940
1930 V = 1
1940 RETURN
2000 :
2010 REM ***** EDIT VECTOR FILES -PLOTTING ******
2020 :
2030 HC = 3:XC = 112:YC = 82: HGR
2040 HOME : VTAB 21
2050 INVERSE : PRINT " *EDIT VECTOR FILES* ?-INSTRUCTIONS ";: NORMAL
2060 REM -DRAW CURSOR-
2070 GOSUB 1000
2080 AD = 2561:AA = AD:V = 1
2090 REM -POKE IN HEADER-
2100 POKE AD -1,0: POKE AD -2,4
2110 POKE AD -3,0: POKE AD -4,1
2120 POKE AA,0: POKE AA +1,0
2130 REM -DRAW DIVIDING LINE-
2140 HCOLOR= 3: HPLOT 221,0 TO 221,158 TO 222,158 TO 222,0
2150 REM -POSITION CURSOR-
2160 GOSUB 1300
2170 XS = XC:YS = YC
2180 VTAB 22: HTAB 1: PRINT "B-BACK UP ONE S-SAVE SHAPE C-COLOR "
2190 PRINT "E-ERASE SHAPE L-LOAD SHAPE V-VIEW ";
2200 PRINT "R- RE-PLOT <ESC> MENU D-DOS ";
2210 REM -DRAW CURSOR-
2220 GOSUB 1000:LOC = 3
2230 REM -DRAW SMALL SHAPES-
2240 HCOLOR= HC: GOSUB 1100
2250 REM -GET COMMAND-
2260 GET Z$: GOSUB 1000:OX = XC:OY = YC
2270 HCOLOR= 0: GOSUB 1100
2280 IF Z$ = CHR$(27) THEN 400
2290 IF Z$ = "?" THEN 8000
2300 IF Z$ = "B" THEN 3000
2310 IF Z$ = "E" THEN HGR : GOTO 2040
2320 IF Z$ = "R" THEN SH = 3: GOSUB 1700: GOTO 2040
2330 IF Z$ = "S" THEN LOC = 4: GOTO 3400
2340 IF Z$ = "L" THEN LOC = 5: GOTO 3600
2350 IF Z$ = "C" THEN 3800
2360 IF Z$ = "V" THEN LOC = 7: GOTO 4200
2370 IF Z$ = "D" THEN LOC = 6: GOTO 3900
2380 REM -CURSOR/PLOTTING MOVES-
2390 IF Z$ = "I" THEN GOSUB 2500: GOSUB 2620:V1$ = "0": GOTO 2700
2400 IF Z$ = "J" THEN GOSUB 2530:V1$ = "0": GOTO 2700
2410 IF Z$ = "K" THEN GOSUB 2560:V1$ = "0": GOTO 2700
2420 IF Z$ = "M" THEN GOSUB 2590:V1$ = "0": GOTO 2700
2430 IF Z$ = CHR$(9) THEN GOSUB 2500:V1$ = "1": HCOLOR= 3: GOSUB 1200: GOTO 2700
2440 IF Z$ = CHR$(10) THEN GOSUB 2530:V1$ = "1": HCOLOR= 3: GOSUB 1200: GOTO 2700
2450 IF Z$ = CHR$(11) THEN GOSUB 2560:V1$ = "1": HCOLOR= 3: GOSUB 1200: GOTO 2700
2460 IF Z$ = CHR$(13) THEN GOSUB 2590:V1$ = "1": HCOLOR= 3: GOSUB 1200: GOTO 2700
2470 GOTO 2210
2500 REM -UP VECTOR-
2510 YC = YC -5: IF YC <0 THEN YC = 2: POP : GOTO 2210
2520 V2$ = "00": RETURN
2530 REM -LEFT VECTOR-
2540 XC = XC -5: IF XC <0 THEN XC = 2: POP : GOTO 2210
2550 V2$ = "11": RETURN
2560 REM -RIGHT VECTOR-
2570 XC = XC +5: IF XC >219 THEN XC = 217: POP : GOTO 2210
2580 V2$ = "01": RETURN
2590 REM -DOWN VECTOR-
2600 YC = YC +5: IF YC >159 THEN YC = 157: POP : GOTO 2210
2610 V2$ = "10": RETURN
2620 REM -UP-NO-PLOT CHECKING-
2630 IF V = 1 THEN 2660
2640 IF VK$(1) < >"000" THEN VK$ = "00000" +VK$(1): GOSUB 2800:AA = AA +1:V = 1: GOTO 2660
2650 VK$ = "00011" +VK$(1): GOSUB 2800:AA = AA +1:VK$ = "00001000": GOSUB 2800:AA = AA +1:V = 1: POP : GOTO 2210
2660 RETURN
2700 REM -SET UP VECTORS TO BE POKED-
2710 VK$(V) = V1$ +V2$
2720 IF V = 1 THEN VK$ = "00000" +VK$(1)
2730 IF V = 2 THEN VK$ = "00" +VK$(2) +VK$(1)
2740 GOSUB 2800
2750 IF V = 1 THEN V = 2: GOTO 2210
2760 V = 1:AA = AA +1: GOTO 2210
2800 REM -POKING OF VECTORS-
2810 BT = 0
2820 FOR N = 1 TO 8
2830 IF MID$ (VK$,N,1) = "0" THEN 2850
2840 BT = BT +2 ^(8 -N)
2850 NEXT N
2860 POKE AA,BT: POKE AA +1,0
2870 RETURN
3000 :
3010 REM ****** BACK UP ONE *********************
3020 :
3030 IF AA = AD AND PEEK(AA) = 0 AND V = 1 THEN 3230
3040 REM -ERASE SMALL SHAPES-
3050 HCOLOR= 0: GOSUB 1100
3060 IF V = 2 THEN BT = PEEK(AA)
3070 IF V = 1 THEN BT = PEEK(AA -1)
3080 REM -CONVERT TO BINARY STRING-
3090 GOSUB 1500
3100 IF V = 1 AND MID$ (B$,3,3) = "000" THEN V = 2:AA = AA -1: GOTO 3060
3110 IF V = 2 THEN V1$ = MID$ (B$,6,1):V2$ = MID$ (B$,7,2)
3120 IF V = 1 THEN V1$ = MID$ (B$,3,1):V2$ = MID$ (B$,4,2)
3130 REM -MOVE CURSOR-
3140 IF V2$ = "00" THEN YC = YC +5
3150 IF V2$ = "11" THEN XC = XC +5
3160 IF V2$ = "01" THEN XC = XC -5
3170 IF V2$ = "10" THEN YC = YC -5
3180 REM -ERASE BLOCK-
3190 IF V1$ = "1" THEN HCOLOR= 0:OX = XC:OY = YC: GOSUB 1200
3200 REM -ERASE VECTOR-
3210 IF V = 2 THEN V = 1: POKE AA,0: GOTO 3230
3220 V = 2:AA = AA -1:BT = PEEK(AA): GOSUB 1500:VK$(1) = MID$ (B$,6,3):VK$ = "00000" +VK$(1): GOSUB 2800
3230 GOTO 2210
3400 :
3410 REM ***** SAVE VECTOR FILE *****************
3420 :
3430 IF AA = AD AND PEEK(AA) = 0 THEN 2210
3440 VTAB 22: HTAB 1: PRINT " <ESC> TO ABORT "
3450 PRINT "NAME FOR VECTOR FILE? VECTORS/ "
3460 PRINT " ";: REM 39 SPACES IN QUOTES
3470 VTAB 23: HTAB 31:LMT = 22: GOSUB 700
3480 IF W$ = "" OR W$ = CHR$(27) THEN 2180
3490 IF W$ = "?" THEN 8000
3500 VTAB 22: HTAB 39: PRINT : ONERR GOTO 5000
3510 PRINT D$;"BSAVE VECTORS/";W$;",A2561,L";AA -AD +2
3520 POKE 216,0: GOTO 2180
3600 :
3610 REM ***** LOAD VECTOR FILE *****************
3620 :
3630 VTAB 22: HTAB 1: PRINT " <ESC> TO ABORT "
3640 PRINT "NAME OF VECTOR FILE? VECTORS/ "
3650 PRINT " ";: REM 39 SPACES IN QUOTES
3660 VTAB 23: HTAB 30:LMT = 22: GOSUB 700
3670 IF W$ = "" OR W$ = CHR$(27) THEN 2180
3680 IF W$ = "?" THEN 8000
3690 VTAB 22: HTAB 39: PRINT : ONERR GOTO 5000
3700 PRINT D$;"BLOAD VECTORS/";W$;",A2561": POKE 216,0
3710 HGR : HCOLOR= 3: HPLOT 221,0 TO 221,158 TO 222,158 TO 222,0
3720 SH = 2: GOSUB 1700
3730 IF FED = 0 THEN 2180
3740 HOME : GOSUB 1000: VTAB 22: PRINT "IT WON'T FIT STARTING FROM THAT CURSOR"
3750 PRINT "POSITION. TRY ANOTHER. (PUSH <RETURN>) ";
3760 GET Z$: HOME : VTAB 21: INVERSE : PRINT " *EDIT VECTOR FILES* ?-INSTRUCTIONS ";: NORMAL : IF Z$ = CHR$(27) THEN 2180
3770 IF Z$ = "?" THEN 8000
3780 GOSUB 1300:XS = XC:YS = YC: GOTO 3710
3800 :
3810 REM ***** CHANGE COLOR *********************
3820 :
3830 HC = HC +1: IF HC >6 THEN HC = 1
3840 IF HC = 4 THEN HC = 5
3850 GOTO 2210
3900 :
3910 REM ******* DOS COMMANDS *******************
3920 :
3930 HOME : VTAB 21: INVERSE : PRINT " *EDIT VECTOR FILES* ?-INSTRUCTIONS ";: NORMAL
3940 PRINT "DOS COMMANDS: C-CATALOG"
3950 PRINT TAB( 16);"D-DELETE"
3960 PRINT TAB( 16);"<ESC> TO RETURN ";
3970 GET Z$: IF Z$ = CHR$(27) THEN POKE -16304,0: GOTO 2180
3980 IF Z$ = "?" THEN 8000
3990 IF Z$ = "C" THEN 4020
4000 IF Z$ = "D" THEN 4060
4010 GOTO 3970
4020 TEXT : POKE 35,20: VTAB 1: HOME : PRINT
4030 PRINT D$;"CATALOG"
4040 POKE 35,24: VTAB 24: HTAB 33
4050 GOTO 3970
4060 VTAB 22: HTAB 1: PRINT " <ESC> TO ABORT "
4070 PRINT "FILE TO BE DELETED? ";: VTAB 23: HTAB 22
4080 LMT = 30: GOSUB 700: IF W$ = "" OR W$ = CHR$(27) THEN 3930
4090 VTAB 22: HTAB 39: PRINT : ONERR GOTO 5000
4100 PRINT D$;"DELETE ";W$
4110 POKE 216,0: GOTO 3930
4200 :
4210 REM ******* VIEW SHAPE *********************
4220 :
4230 HGR : VTAB 22: HTAB 1
4240 X = 140:Y = 80: POKE 232,L2: POKE 233,H2
4250 CC = 3: HCOLOR= CC
4260 RR = 0: ROT= RR
4270 SS = 1: SCALE= SS
4280 PRINT " ": REM 39 SPACES IN QUOTES
4290 PRINT " C - COLOR (3 ) R - ROTATION (0 ) "
4300 PRINT " S - SCALE (1 ) <ESC> TO RETURN ";
4310 HCOLOR= CC: DRAW 1 AT X,Y
4320 GET Z$: HCOLOR= 0: DRAW 1 AT X,Y
4330 IF Z$ = "?" THEN 8000
4340 IF Z$ < > CHR$(27) THEN 4370
4350 HGR : HCOLOR= 3: HPLOT 221,0 TO 221,158 TO 222,158 TO 222,0
4360 SH = 2: GOSUB 1700: GOTO 2180
4370 IF Z$ < >"C" THEN 4430
4380 CC = CC +1: IF CC >6 THEN CC = 1
4390 IF CC = 4 THEN CC = 5
4400 VTAB 23: HTAB 13: PRINT " ";
4410 HTAB 13: PRINT CC;: VTAB 24: HTAB 40
4420 GOTO 4310
4430 IF Z$ < >"S" THEN 4470
4440 SS = SS +1: IF SS >10 THEN SS = 1
4450 SCALE= SS: VTAB 24: HTAB 13: PRINT " ";
4460 HTAB 13: PRINT SS;: HTAB 40: GOTO 4310
4470 IF Z$ < >"R" THEN 4510
4480 RR = RR +1: IF RR >63 THEN RR = 0
4490 ROT= RR: VTAB 23: HTAB 35: PRINT " ";
4500 HTAB 35: PRINT RR;: VTAB 24: HTAB 40: GOTO 4310
4510 IF Z$ = "I" THEN Y = Y -5: IF Y <0 THEN Y = Y +159
4520 IF Z$ = "J" THEN X = X -5: IF X <0 THEN X = X +279
4530 IF Z$ = "K" THEN X = X +5: IF X >279 THEN X = X -279
4540 IF Z$ = "M" THEN Y = Y +5: IF Y >159 THEN Y = Y -159
4550 GOTO 4310
5000 :
5010 REM ****** DISK ERROR HANDLING *************
5020 :
5030 ER = PEEK(222): IF LOC = 8 OR LOC = 9 THEN POKE 35,24
5040 VTAB 22: HTAB 1
5050 PRINT " ": REM 39 SPACES IN QUOTES
5060 PRINT " "
5070 PRINT " ";: REM 39 SPACES IN QUOTES
5080 VTAB 23: HTAB 1
5090 IF ER = 6 THEN PRINT "THAT FILE IS NOT ON THIS DISK.": GOTO 5150
5100 IF ER = 9 THEN PRINT "THERE ISN'T ENOUGH ROOM ON THIS DISK.": GOTO 5150
5110 IF ER = 10 THEN PRINT "THAT FILE IS LOCKED.": GOTO 5150
5120 IF ER = 11 THEN PRINT "THAT IS NOT A LEGAL FILE NAME.": GOTO 5150
5130 PRINT "A SYSTEM ERROR #";ER;" HAS OCCURRED IN"
5140 PRINT "LINE #"; PEEK(218) + PEEK(219) *256: END
5150 PRINT " (PUSH <RETURN>) ";: GET Z$
5160 ON LOC GOTO 400,2040,2180,3440,3630,3930,4500,6040,6430,7000,7190
6000 :
6010 REM ****** BUILD SHAPE TABLE ***************
6020 :
6030 AD = 2561:AA = AD:SNUM = 1:TL = 0
6040 TEXT : HOME : VTAB 21
6050 INVERSE : PRINT " *BUILD SHAPE TABLE* ?-INSTRUCTIONS ";: NORMAL
6060 PRINT "TYPE: END <RETURN> WHEN FINISHED"
6070 PRINT " C <RETURN> TO DO A CATALOG"
6080 PRINT " <ESC><RETURN> TO ABORT ";
6090 REM -SET TEXT WINDOW-
6100 POKE 35,20
6110 HOME
6111 PRINT : PRINT "N)EW SHAPE TABLE"
6112 PRINT "E)XISTING SHAPE TABLE"
6113 GET W$: PRINT W$: IF W$ = "E" THEN GOTO 9500
6120 PRINT "NAME OF SHAPE ";SNUM;": VECTORS/";
6130 LMT = 22: GOSUB 700
6140 IF W$ = "" OR W$ = CHR$(27) THEN PRINT : GOTO 6500
6150 IF W$ = "?" THEN POKE 35,24:LOC = 8: GOTO 8000
6160 IF W$ = "C" THEN PRINT : PRINT D$;"CATALOG": PRINT : GOTO 6120
6170 IF W$ = "END" THEN 6270
6180 LOC = 8: ONERR GOTO 5000
6190 PRINT : PRINT D$;"BLOAD VECTORS/";W$;",A";AA: POKE 216,0
6200 L(SNUM) = PEEK( -21920) + PEEK( -21919) *256
6210 AA = AA +L(SNUM)
6220 SNUM = SNUM +1
6230 IF SNUM <256 THEN 6120
6240 PRINT : PRINT "THAT'S THE MAXIMUM NUMBER OF SHAPES YOU CAN HAVE IN ONE TABLE. END TABLE OR ABORT? (E/A) ";: GET Z$
6250 IF Z$ = "E" THEN 6270
6260 GOTO 6500
6270 REM -POKE HEADER OF TABLE-
6280 SNUM = SNUM -1:TL = 0: IF AA = AD THEN 6500
6290 FOR N = 1 TO SNUM
6300 TL = TL +L(N)
6310 NEXT N
6320 TTL = TL +SNUM *2 +2:TL = TTL
6330 FOR N = SNUM TO 1 STEP -1
6340 TL = TL -L(N)
6350 HB = INT(TL/256)
6360 LB = TL -HB *256
6370 POKE AD -(SNUM -N) *2 -1,HB
6380 POKE AD -(SNUM -N) *2 -2,LB
6390 NEXT N
6400 POKE AD -SNUM *2 -1,0
6410 POKE AD -SNUM *2 -2,SNUM
6420 PRINT : PRINT "TABLE IS ";TTL;" BYTES LONG."
6430 PRINT "NAME FOR TABLE? TABLE/";
6440 LMT = 22: GOSUB 700
6450 IF W$ = "" OR W$ = CHR$(27) THEN PRINT : GOTO 6500
6460 IF W$ = "?" THEN LOC = 9: GOTO 8000
6470 LOC = 9: ONERR GOTO 6320
6480 PRINT : PRINT D$;"BSAVE TABLE/";W$;",A";AD -SNUM *2 -2;",L";TTL
6490 POKE 216,0
6500 PRINT "DO YOU WANT TO DO ANOTHER? (Y/N) ";: GET Z$
6510 IF Z$ = "Y" THEN SNUM = 1:AA = AD: GOTO 6110
6520 POKE 35,24
6530 GOTO 400
7000 :
7010 REM ****** VIEW SHAPE TABLE ****************
7020 :
7030 HOME : VTAB 21: HGR :LOC = 10
7040 INVERSE : PRINT " *VIEW SHAPE TABLE* ?-INSTRUCTIONS ";: NORMAL
7050 PRINT "TYPE <ESC> <RETURN> TO ABORT"
7060 PRINT "NAME OF TABLE? TABLE/";
7070 LMT = 22: GOSUB 700
7080 IF W$ = "" OR W$ = CHR$(27) THEN 400
7090 IF W$ = "?" THEN 8000
7100 VTAB 23: PRINT
7110 ONERR GOTO 5000
7120 PRINT D$;"BLOAD TABLE/";W$;",A 2050"
7130 POKE 216,0
7140 POKE 232,2: POKE 233,8
7150 SNUM = PEEK(2050)
7160 LOC = 11
7170 CC = 3: HCOLOR= CC:RR = 0: ROT= RR:SS = 1: SCALE= SS
7180 X = 140:Y = 80:NN = 1
7190 HOME : VTAB 21
7200 INVERSE : PRINT " *VIEW SHAPE TABLE* ?-INSTRUCTIONS ";: NORMAL
7210 PRINT "<ESC> WHEN FINISHED"
7220 PRINT "N-UMBER OF SHAPE (1 ) S-CALE (1 )"
7230 PRINT "C-HANGE COLOR (3 ) R-OTATION (0 )";
7240 HCOLOR= CC: DRAW NN AT X,Y
7250 GET Z$
7260 IF Z$ = CHR$(27) THEN 400
7270 IF Z$ = "?" THEN 8000
7280 HCOLOR= 0: DRAW NN AT X,Y
7290 IF Z$ < >"N" THEN 7340
7300 NN = NN +1: IF NN >SNUM THEN NN = 1
7310 VTAB 23: HTAB 19: PRINT " ";
7320 HTAB 19: PRINT NN;: VTAB 24: HTAB 40
7330 GOTO 7240
7340 IF Z$ < >"S" THEN 7390
7350 SS = SS +1: IF SS >10 THEN SS = 1
7360 VTAB 23: HTAB 37: PRINT " ";
7370 HTAB 37: PRINT SS;: VTAB 24: HTAB 40
7380 SCALE= SS: GOTO 7240
7390 IF Z$ < >"R" THEN 7440
7400 RR = RR +1: IF RR >63 THEN RR = 0
7410 VTAB 24: HTAB 37: PRINT " ";
7420 HTAB 37: PRINT RR;: HTAB 40
7430 ROT= RR: GOTO 7240
7440 IF Z$ < >"C" THEN 7500
7450 CC = CC +1: IF CC >6 THEN CC = 1
7460 IF CC = 4 THEN CC = 5
7470 VTAB 24: HTAB 19: PRINT " ";
7480 HTAB 19: PRINT CC;: HTAB 40
7490 GOTO 7240
7500 REM -MOVE SHAPE AROUND-
7510 IF Z$ = "I" THEN Y = Y -5: IF Y <0 THEN Y = 159
7520 IF Z$ = "J" THEN X = X -5: IF X <0 THEN X = 279
7530 IF Z$ = "K" THEN X = X +5: IF X >279 THEN X = 0
7540 IF Z$ = "M" THEN Y = Y +5: IF Y >159 THEN Y = 0
7550 GOTO 7240
8000 :
8010 REM ****** INSTRUCTIONS ********************
8020 :
8030 TEXT : HOME
8040 IF LOC = 1 THEN 8090
8050 ON LOC GOSUB 8300,8600,8600,8990,8990,9150,9150,9320,9320,9320,9320
8060 VTAB 24: PRINT "(PUSH <ESC> TO RETURN, 'M' FOR MORE) ";
8070 GET Z$: IF Z$ = CHR$(27) THEN 8230
8080 IF Z$ < >"M" THEN 8070
8090 FOR N = 1 TO 5
8100 IF N < >2 AND N < >5 THEN 8150
8110 HOME : VTAB 10
8120 IF N = 2 THEN PRINT "*** SECTION ONE: EDIT VECTOR FILES ***": GOTO 8140
8130 PRINT "*** SECTION TWO: BUILD SHAPE TABLE ***"
8140 FOR D = 1 TO 2500: NEXT D
8150 HOME : ON N GOSUB 8300,8600,8990,9150,9320
8160 VTAB 24
8170 IF N < >5 THEN PRINT "(PUSH <ESC> TO RETURN, 'M' FOR MORE) ";
8180 IF N = 5 THEN PRINT "(PUSH <ESC> TO RETURN, 'R' TO REPEAT) ";
8190 GET Z$: IF Z$ = CHR$(27) THEN 8230
8200 IF N < >5 AND Z$ < >"M" THEN 8190
8210 IF N = 5 AND Z$ < >"R" THEN 8190
8220 NEXT N: GOTO 8090
8230 HOME : POKE -16304,0
8240 IF LOC = 3 OR LOC = 4 OR LOC = 5 OR LOC = 7 THEN INVERSE : VTAB 21: PRINT " *EDIT VECTOR FILES* ?-INSTRUCTIONS ";: NORMAL
8250 ON LOC GOTO 400,2040,2180,3400,3600,3900,4200,6040,6040,7000,7190
8300 REM -PAGE ONE-
8310 PRINT : PRINT TAB( 8);"*** NIBBLE ILLUSTRATOR ***": PRINT
8320 PRINT " THIS GRAPHICS UTILITY PROGRAM MAKES IT";
8330 PRINT "EASY TO CONSTRUCT COMPLEX SHAPE TABLES"
8340 PRINT "FOR USE IN YOUR OWN PROGRAMS.": PRINT
8350 PRINT " SECTION 1 'EDIT VECTOR FILES' IS USED"
8360 PRINT "TO DESIGN SHAPES. THE SET OF VECTORS"
8370 PRINT "DESCRIBING THE SHAPE IS SAVED TO DISK,"
8380 PRINT "CREATING A DISK LIBRARY OF SHAPES.": PRINT
8390 PRINT " SECTION 2 'BUILD SHAPE TABLE' COMBINES";
8400 PRINT "SHAPES FROM THIS LIBRARY INTO A FINISHED";
8410 PRINT "SHAPE TABLE.": PRINT
8420 PRINT " FOR MORE INFORMATION ON SHAPE TABLES"
8430 PRINT "AND HOW TO USE THEM SEE PAGES 91 TO 100"
8440 PRINT "OF THE APPLESOFT MANUAL."
8450 VTAB 24: PRINT "(PUSH <ESC> TO RETURN, 'M' FOR MORE) ";
8460 GET Z$: IF Z$ = CHR$(27) THEN POP : GOTO 8230
8470 IF Z$ < >"M" THEN 8460
8480 HOME : PRINT " AT MOST LOCATIONS IN THE PROGRAM YOU"
8490 PRINT "MAY ESCAPE FROM THE FUNCTION BEING USED"
8500 PRINT "BY PUSHING THE <ESC> KEY. AT LOCATIONS"
8510 PRINT "WHERE YOU ARE EXPECTED TO INPUT A FULL"
8520 PRINT "WORD, SUCH AS THE NAME FOR A FILE, TO"
8530 PRINT "ESCAPE YOU MUST ENTER <ESC> <RETURN>.": PRINT
8540 PRINT " YOU MAY ALSO GET INSTRUCTIONS FROM"
8550 PRINT "ANYWHERE IN THE PROGRAM BY ENTERING A"
8560 PRINT "'?', AND PUSHING <RETURN> IF REQUIRED.": PRINT
8570 PRINT " WHAT FOLLOWS IS A DESCRIPTION OF EACH"
8580 PRINT "FUNCTION IN BOTH OF THE SECTIONS."
8590 RETURN
8600 REM -PAGE TWO-
8610 PRINT "PLOTTING:": PRINT
8620 PRINT " THE CURSOR MAY BE MOVED ANYWHERE IN"
8630 PRINT "THE 32 X 44 SQUARE PLOTTING AREA BEFORE"
8640 PRINT "STARTING. USE THE I,J,K & M KEYS TO MOVE";
8650 PRINT "UP, LEFT, RIGHT AND DOWN RESPECTIVELY."
8660 PRINT "PUSH THE SPACE BAR WHEN YOU HAVE REACHED";
8670 PRINT "YOUR STARTING POINT.": PRINT
8680 PRINT " PLOT POINTS BY USING THE I,J,K & M "
8690 PRINT "KEYS AGAIN TO MOVE THE CURSOR. PUSHING"
8700 PRINT "JUST THE KEY WILL MOVE THE CURSOR IN THE";
8710 PRINT "PROPER DIRECTION, CREATING A 'NO-PLOT'"
8720 PRINT "VECTOR. HOLDING DOWN THE 'CTRL' KEY AND"
8730 PRINT "PUSHING I,J,K OR M WILL PLOT THE BLOCK"
8740 PRINT "THE CURSOR IS ON BEFORE MOVING IN THE"
8750 PRINT "APPROPRIATE DIRECTION. THIS CREATES A"
8760 PRINT "'PLOT' TYPE VECTOR."
8770 VTAB 24: PRINT "(PUSH <ESC> TO RETURN, 'M' FOR MORE) ";
8780 GET Z$: IF Z$ = CHR$(27) THEN POP : GOTO 8230
8790 IF Z$ < >"M" THEN 8780
8800 HOME : PRINT " ON THE RIGHT HAND SIDE OF THE SCREEN"
8810 PRINT "THE SHAPE YOU ARE PLOTTING IS DISPLAYED"
8820 PRINT "WITH ROTATION SET TO ZERO AND SCALE SET"
8830 PRINT "TO ONE. BELOW THIS IS THE SAME SHAPE"
8840 PRINT "DISPLAYED WITH ROTATION SET TO 16. THE"
8850 PRINT "COLOR OF THESE SHAPES CAN BE CHANGED BY"
8860 PRINT "PUSHING THE 'C' KEY.": PRINT
8870 PRINT " IF YOU MAKE AN ERROR YOU CAN BACK UP"
8880 PRINT "AND 'UN-PLOT' ONE VECTOR AT A TIME BY"
8890 PRINT "PUSHING THE 'B' KEY.": PRINT
8900 PRINT " YOU MAY ALSO RE-PLOT THE ENTIRE SHAPE"
8910 PRINT "BY PUSHING THE 'R' KEY. THE CURSOR IS"
8920 PRINT "THEN POSITIONED WHERE YOU WANT TO BEGIN"
8930 PRINT "PLOTTING AND THE BLOCKS PLOTTED IN THE"
8940 PRINT "USUAL WAY. THE OLD SHAPE REMAINS ON THE"
8950 PRINT "SCREEN AS A GUIDE.": PRINT
8960 PRINT " TO START ALL OVER AGAIN PUSH THE 'E'"
8970 PRINT "KEY TO ERASE THE SHAPE AND ITS VECTORS."
8980 RETURN
8990 REM -PAGE THREE-
9000 PRINT "SAVE SHAPE:": PRINT
9010 PRINT " THIS SAVES TO DISK THE FILE OF VECTORS";
9020 PRINT "THAT DESCRIBES THE SHAPE. PUSHING <ESC>"
9030 PRINT "<RETURN> ESCAPES BACK TO THE PLOTTING"
9040 PRINT "FUNCTION.": PRINT : PRINT : PRINT
9050 PRINT "LOAD SHAPE:": PRINT
9060 PRINT " WHEN LOADING A VECTOR FILE FROM DISK"
9070 PRINT "THE SHAPE IS PLOTTED OUT FOR USE IN THE"
9080 PRINT "RE-PLOT FUNCTION, ETC. IT IS DRAWN FROM"
9090 PRINT "THE CURSOR LOCATION. IF IT WILL NOT FIT"
9100 PRINT "ON THE SCREEN YOU WILL BE PROMPTED TO"
9110 PRINT "MOVE THE CURSOR AND TRY AGAIN."
9120 PRINT " USE THE <ESC> KEY TO ESCAPE BACK TO"
9130 PRINT "THE PLOTTING FUNCTION."
9140 RETURN
9150 REM -PAGE FOUR-
9160 PRINT "DOS COMMANDS:": PRINT
9170 PRINT " TWO COMMANDS ARE AVAILABLE: 'CATALOG'"
9180 PRINT "AND 'DELETE'. NOTE THAT DELETE DOES NOT"
9190 PRINT "SUPPLY A PREFIX SUCH AS 'VECTORS/' OR"
9200 PRINT "'TABLE/' FOR THE FILENAME OF THE FILE"
9210 PRINT "TO BE DELETED."
9220 PRINT " USE <ESC> TO RETURN TO THE PLOTTING"
9230 PRINT "FUNCTION.": PRINT : PRINT
9240 PRINT "VIEW SHAPE:": PRINT
9250 PRINT " SHAPES MAY BE VIEWED WITH CONTROL OVER";
9260 PRINT "THEIR COLOR, SCALE AND ROTATION. NOTE"
9270 PRINT "THAT AT SMALLER SCALE FACTORS THERE ARE"
9280 PRINT "FEWER ANGLES OF ROTATION AVAILABLE."
9290 PRINT " USE <ESC> TO RETURN TO THE PLOTTING"
9300 PRINT "FUNCTION."
9310 RETURN
9320 REM -PAGE FIVE-
9330 PRINT "BUILD TABLE:": PRINT
9340 PRINT " WHEN PROMPTED, TYPE IN THE NAMES OF"
9350 PRINT "THE VECTOR FILES YOU WANT COMBINED INTO"
9360 PRINT "A SHAPE TABLE. TO INDICATE THE END OF A"
9370 PRINT "TABLE ENTER 'END' <RETURN>. YOU CAN DO"
9380 PRINT "A CATALOG OF THE DISK BY TYPING 'C' AND"
9390 PRINT "<RETURN>; AND TO ABORT BUILDING A TABLE"
9400 PRINT "ENTER <ESC> <RETURN>.": PRINT : PRINT : PRINT
9410 PRINT "VIEW TABLE:": PRINT
9420 PRINT " YOU MAY LOAD A SHAPE TABLE AND VIEW"
9430 PRINT "ANY OF ITS SHAPES WITH CONTROL OVER THE"
9440 PRINT "COLOR, SCALE AND ROTATION OF THE SHAPE."
9450 PRINT "NOTE THAT AT SMALLER SCALE FACTORS THERE";
9460 PRINT "ARE FEWER ANGLES OF ROTATION AVAILABLE."
9470 PRINT " USE <ESC> TO RETURN TO THE MAIN MENU."
9480 RETURN
9500 HOME : PRINT : PRINT "NAME OF EXISTING SHAPE TABLE."
9510 PRINT : INPUT "TABLE/";W$: IF W$ = CHR$(27) OR W$ = "" THEN GOTO 420
9520 ONERR GOTO 10000
9530 PRINT D$;"BLOAD TABLE/";W$;",A2561"
9540 SNUM = PEEK(2561): IF SNUM > = 256 THEN GOTO 6290
9550 TL = PEEK(43616) + PEEK(43617) *256
9560 L(SN) = TL - PEEK(AD +(2 *SNUM)) - PEEK(AD +(2 *SNUM) +1) *256
9570 FOR I = SNUM -1 TO 1 STEP -1
9580 L(I) = PEEK(AD +(I *2) +3) *256 + PEEK(AD +(2 *I) +2) - PEEK(AD +(2 *I) +1) *256 - PEEK(AD +2 *I)
9590 NEXT I
9600 AA = AA +TL:TL = 0:AD = AD +2 *(SNUM +1): POKE 216,0: GOTO 6220
10000 PRINT "ERROR--THAT TABLE IS NOT ON THIS DISK": GOTO 9510